#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <randomhelper.h>

char rd_get_char(int flags)
{
    switch (flags) {
    case RD_ALL:
        return (char) rd_get(1, 128);

    case RD_ALPHA: {
        int r = rd_get(0, 52);
        return (r < 26) ? ('a' + r) : ('A' + r - 26);
    }

    case RD_UPPER:
        return (char) rd_get(0, 26) + 'A';

    case RD_LOWER:
        return (char) rd_get(0, 26) + 'a';

    case RD_DIGIG:
        return (char) rd_get(0, 10) + '0';

    case RD_HEX:{
        int r = rd_get(0, 16);
        return (r < 10) ? (r + '0') : (r - 10 + 'A');
    }

    case RD_ALPHA_DIGIG: {
        int r = rd_get(0, 52 + 10);
        if (r < 10)
            return (char) r + '0';
        r -= 10;
        return (r < 26) ? ('a' + r) : ('A' + r - 26);
    }

    }

    return '?';
}

int rd_get(int min, int max)
{
    int dif = max - min;

    if (dif <= 0)
        return min;

    int r = random();

    if (r < 0)
        r = -r;

    r %= dif;

    return r + min;
}

void rd_get_str(int min, int max, std::string& res, int flags)
{
    int size = rd_get(min, max);

    if (size <= 0)
        return;

    int i;
    for (i = 0; i < size; i++) {
        char c = rd_get_char(flags);
        res.push_back(c);
    }
}

